//
//  DBManager.h
//  iOSDemo
//
//  Created by mokai on 14/10/27.
//  Copyright (c) 2014年 mokai. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <FMDB/FMDB.h>
@interface DB : NSObject
/**
 *  当前指针表名，几乎所有没传表的方法都是参考此表名
 */
@property(nonatomic,copy) NSString *currentTableName;



#pragma mark getdb 获得对象


/**
 *  基于临时的数据库，系统重启则清空，位于/tmp/tmp.db
 *
 *  @return
 */
+(DB *)defaultDB;


/**
 *  基于自定义的数据库
 *
 *  @param dbName 数据库名字，需要包括后缀
 *
 *  @return
 */
+(DB *)dbWithDBName:(NSString *)dbName;


/**
 *  基于内存的数据库
 *
 *  @return
 */
+(DB *)dbWithMemory;

/**
 *  关闭数据库，在对象销毁前会自动关掉数据库，但考虑到对象的生命周期可能比较长，则可以选择手动打开
 */
-(void)close;

#pragma mark executes 更新
/**
 *  上次更新操作返回的成功行数
 *
 *  @return
 */
-(int)changes;
/**
 *  创建表Table
 *
 *  @param sql
 *
 *  @return
 */
-(BOOL)t:(NSString *)sql;



/**
 *  执行更新语句，包括
 CREATE, UPDATE, INSERT, ALTER, COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE
 *
 *  @param sql
 *
 *  @return
 */
-(BOOL)e:(NSString *)sql;

/**
 *
 *
 *  @param sql    <#sql description#>
 *  @param params <#params description#>
 *
 *  @return <#return value description#>
 */
-(BOOL)e:(NSString *)sql params:(NSDictionary *)params;


/**
 *  插入,注意,NSDictionary的Key应该与表字段保持一致，只少不多
 *
 *  @param data
 *
 *  @return
 */
-(BOOL)i:(NSDictionary *)data;


/**
 *  更新
 *
 *  @param data 要更新的数据
 *  @param where 条件过渡，注意，过渡的条件都是and
 *  @return
 */
-(BOOL)u:(NSDictionary *)data where:(NSDictionary *)where;

/**
 *  删除
 *
 *  @param where
 *
 *  @return
 */
-(BOOL)d:(NSDictionary *)where;

/**
 *  构建AND条件查询sql，包含where
 *
 *  @param where
 *
 *  @return
 */
-(NSString *)whereSQl:(NSDictionary *)where;



/**
 *  事务执行块，可以传入的块中进行多个操作
 */
-(void)transaction:(void(^)(FMDatabase *fmdb)) transBlock;


/**
 *  事务回滚，这方法只适合在transaction方法的block中进行调用
 */
-(void)rollback;

#pragma mark querys 查询
/**
 *  自定义查询
 *
 *  @param sql
 *
 *  @return
 */
-(NSArray *)query:(NSString *)sql;

/**
 *  查询单行
 *
 *  @param sql
 *
 *  @return
 */
-(NSDictionary *)querySingle:(NSString *)sql;


/**
 *  查询单字段
 与querySingle相比，querySingle是查询一行，本方法是查询一列
 *
 *  @param sql
 *
 *  @return
 */
-(NSArray *)queryField:(NSString *)sql;

/**
 查询单个字段
 **/
-(NSString *)queryValue:(NSString *)sql;

/**
 *  查询表中所有数据
 *
 *  @return
 */
-(NSArray *)queryAll;


/**
 *  在当前表中分页查询
 *
 *  @param index
 *  @param size
 *
 *  @return
 */
-(NSArray *)queryPage:(int)index size:(int)size;


/**
 *  分页查询
 *
 *  @param sql
 *  @param index 页码
 *  @param size  页长度
 *
 *  @return
 */
-(NSArray *)queryPage:(NSString *)sql index:(int)index size:(int)size;


/**
 *  获得表中行数
 *
 *  @return
 */
-(int)count;


@end
